package mystring

import (
	"fmt"
	"unicode/utf8"
)

func ToRune() {

	fmt.Println("func toRune():")
	s := "hello世界!"
	fmt.Println("字节数:", len(s))                    //12
	fmt.Println("字符数：", utf8.RuneCountInString(s)) //8

	//将s遍历打印，得到的是int32（4字节）的16进制的unicode编码
	fmt.Printf("将s遍历打印:")
	for k, v := range s {
		fmt.Printf("(%d %c[%X]) ", k, v, v)
	}
	fmt.Println("")

	//强制将字符串转成byte切片，打印每个元素的值
	fmt.Printf("强制将字符串转成byte切片:")
	for k, v := range []byte(s) {
		fmt.Printf("(%d %X) ", k, v)
	}
	fmt.Println("")

	//将强制转成byte切片进行解码，就能得到对应的中文字符
	fmt.Printf("byte切片进行解码:")
	bytes := []byte(s)
	for len(bytes) > 0 {
		r, size := utf8.DecodeRune(bytes) //返回第一个能够解析出来的字符和该字符所占用的长度
		fmt.Printf("%c[%X] ", r, r)
		bytes = bytes[size:]
	}
	fmt.Println("")

	//其实直接强转成rune切片可以直接解码出每个字符对应的码
	fmt.Printf("直接强转成rune切片:")
	for k, v := range []rune(s) {
		fmt.Printf("(%d %c[%X]) ", k, v, v)
	}
	fmt.Println("")
	fmt.Println("====================================================")
}
